/**
 * 编码修复中间件
 * 在读取数据后立即修复所有字符串的编码问题
 */

/**
 * 修复字符串编码
 * @param {string} str - 可能乱码的字符串
 * @returns {string} - 修复后的字符串
 */
function fixStringEncoding(str) {
    if (!str || typeof str !== 'string') return str;
    
    try {
        // 检测多种乱码模式
        const garbledPatterns = [
            /[\u00C0-\u00FF]{2,}/,           // 连续latin1扩展字符
            /[çµå¨é¸]/,                     // 特定乱码字符
            /Ã[^A-Za-z\s]/,                   // Ã 后跟非字母
            /[Ã¥Ã¦Ã¯Ã§Ã¨Ã©]/,              // 常见中文乱码
        ];
        
        const hasGarbled = garbledPatterns.some(pattern => pattern.test(str));
        
        if (hasGarbled) {
            // 方法1: 从latin1转UTF-8
            try {
                const bytes = [];
                for (let i = 0; i < str.length; i++) {
                    const code = str.charCodeAt(i);
                    bytes.push(code & 0xff);
                }
                const fixed = Buffer.from(bytes).toString('utf-8');
                
                // 验证修复后包含中文字符
                if (/[\u4e00-\u9fa5]/.test(fixed)) {
                    console.log(`🔧 [Encoding] 修复: "${str}" -> "${fixed}"`);
                    return fixed;
                }
            } catch (e) {
                // 方法1失败，尝试方法2
            }
            
            // 方法2: Buffer转换
            try {
                const fixed = Buffer.from(str, 'latin1').toString('utf-8');
                if (/[\u4e00-\u9fa5]/.test(fixed)) {
                    console.log(`🔧 [Encoding] 修复: "${str}" -> "${fixed}"`);
                    return fixed;
                }
            } catch (e) {
                // 方法2也失败
            }
        }
        
        return str;
    } catch (error) {
        console.warn('⚠️ [Encoding] 修复失败:', error.message);
        return str;
    }
}

/**
 * 递归修复对象中所有字符串的编码
 * @param {*} obj - 要修复的对象
 * @returns {*} - 修复后的对象
 */
function fixObjectEncoding(obj) {
    if (typeof obj === 'string') {
        return fixStringEncoding(obj);
    }
    
    if (Array.isArray(obj)) {
        return obj.map(item => fixObjectEncoding(item));
    }
    
    if (obj && typeof obj === 'object') {
        const fixed = {};
        for (const key in obj) {
            if (obj.hasOwnProperty(key)) {
                fixed[key] = fixObjectEncoding(obj[key]);
            }
        }
        return fixed;
    }
    
    return obj;
}

/**
 * Express中间件：修复响应数据的编码
 */
function encodingFixMiddleware(req, res, next) {
    const originalJson = res.json;
    
    res.json = function(data) {
        // 修复数据中的编码问题
        if (data && data.data) {
            data.data = fixObjectEncoding(data.data);
        }
        
        // 调用原始的json方法
        return originalJson.call(this, data);
    };
    
    next();
}

module.exports = {
    fixStringEncoding,
    fixObjectEncoding,
    encodingFixMiddleware
};

